package handler

import (
	"gitee.com/gopher2011/casdoor/internal/logic/ldap"
	"gitee.com/gopher2011/casdoor/internal/svc"
	"gitee.com/gopher2011/casdoor/internal/types"
	"github.com/gin-gonic/gin"
)

func GetLdapUser(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := ldap.NewLdap(c.Request.Context(), svc.Svc)
	resp, err := l.GetLdapUser(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func GetLdap(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := ldap.NewLdap(c.Request.Context(), svc.Svc)
	resp, err := l.GetLdap(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func GetLdaps(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := ldap.NewLdap(c.Request.Context(), svc.Svc)
	resp, err := l.GetLdaps(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func AddLdap(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := ldap.NewLdap(c.Request.Context(), svc.Svc)
	resp, err := l.AddLdap(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func UpdateLdap(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := ldap.NewLdap(c.Request.Context(), svc.Svc)
	resp, err := l.UpdateLdap(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func DeleteLdap(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := ldap.NewLdap(c.Request.Context(), svc.Svc)
	resp, err := l.DeleteLdap(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func CheckLdapUsersExist(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := ldap.NewLdap(c.Request.Context(), svc.Svc)
	resp, err := l.CheckLdapUsersExist(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}

func SyncLdapUsers(c *gin.Context) {
	var req types.Request
	if err := c.ShouldBind(&req); err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
		return
	}
	l := ldap.NewLdap(c.Request.Context(), svc.Svc)
	resp, err := l.SyncLdapUsers(req)
	if err != nil {
		c.JSON(200, gin.H{"code": 400, "msg": err.Error(), "data": nil})
	} else {
		c.JSON(200, resp)
	}
}
